package rmi.controller;

import hbt.dao.OrdenPedidoDAO;
import hbt.dao.RemitoDAO;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import negocio.ItemOrdenCompra;
import negocio.ItemOrdenPedido;
import negocio.OrdenCompra;
import negocio.OrdenPedido;
import negocio.Proveedor;
import negocio.Remito;
import negocio.Rodamiento;
import transformer.BeanTransformer;
import util.FechaUtil;
import xmlService.OrdenDeCompraXmlService;
import xmlService.RemitoXmlService;
import Enum.EEstadoRemito;
import beans.FacturaBean;

public class LocalController {

	public void generarOrdenesDeCompra() throws Exception {
		List<OrdenPedido> pendientes = OrdenPedidoDAO.getInstancia()
				.findOrdenesDePedidoPendientes();

		Map<Proveedor, Map<Rodamiento, Integer>> map = new HashMap<Proveedor, Map<Rodamiento, Integer>>();
		for (OrdenPedido o : pendientes) {

			// armo un para de rodamiento-cantiadd por cada proveedor y asi
			// luego puedo armar las ordenes de compra por proveedor.
			for (ItemOrdenPedido i : o.getItemsOrdenPedido()) {
				Map<Rodamiento, Integer> rodamientos = map
						.get(i.getProveedor());
				if (rodamientos == null) {
					rodamientos = new HashMap<Rodamiento, Integer>();
				}
				Integer cantidad = rodamientos.get(i.getRodamiento());
				if (cantidad == null) {
					cantidad = 0;
				}
				rodamientos.put(i.getRodamiento(), cantidad + i.getCantidad());
				map.put(i.getProveedor(), rodamientos);
			}
		}

		List<OrdenCompra> ordenesDeCompra = new LinkedList<OrdenCompra>();
		// creo las ORDENES DE COMPRA
		for (Proveedor p : map.keySet()) {
			OrdenCompra oc = new OrdenCompra();

			oc.setFecEmision(FechaUtil.getHoy());
			oc.setProveedor(p);

			Map<Rodamiento, Integer> rodamientos = map.get(p);
			for (Rodamiento r : rodamientos.keySet()) {
				ItemOrdenCompra i = new ItemOrdenCompra();
				i.setRodamiento(r);
				i.setCantidad(rodamientos.get(r));
				oc.getItems().add(i);
			}

			ordenesDeCompra.add(oc);
		}

		OrdenPedidoDAO.getInstancia().actualizarOPYRegistrarOC(ordenesDeCompra,
				pendientes);
		for (OrdenCompra odc : ordenesDeCompra) {
			OrdenDeCompraXmlService.guardarOrdenCompra(
					BeanTransformer.toOrdenDeCompraBean(odc), odc.getNumero());
		}
		/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		 * 
		 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		 * 
		 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		 */
		// para PROBAR!
		for(OrdenPedido op : pendientes){
			generarRemito(op.getNumeroOP());
		}
		
		List<FacturaBean> fact = new RMIController().generarFacturas(1);
		
		
		/* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		 * 
		 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		 * 
		 * %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		 */
	}

	public void generarRemito(int ordenPedidoID) throws Exception {
		OrdenPedido op = OrdenPedidoDAO.getInstancia().findById(ordenPedidoID);
		Remito r = new Remito();
		r.setCliente(op.getCliente());
		r.setEstado(EEstadoRemito.pendiente);
		r.setFechaEmision(FechaUtil.getHoy());
		r.setOrdenPedido(op);
		RemitoDAO.getInstancia().registrarRemito(r);
		RemitoXmlService.guardarRemito(BeanTransformer.toRemitoBean(r));
	}
	
}
